package com.yomahub.liteflow.example.utils;

import cn.hutool.extra.ftp.Ftp;
import cn.hutool.extra.ftp.FtpMode;
import org.apache.commons.net.ftp.FTPClient;
import org.apache.commons.net.ftp.FTPFile;

import java.io.IOException;
import java.nio.charset.StandardCharsets;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.function.BiFunction;

/**
 * @program: FTP工具
 * @description:
 * @author: yanzhichao
 * @create: 2023-11-20 16:55
 **/
public class FtpUtils {

    /**
     * 获取FTP连接
     * @param host IP
     * @param port 端口
     * @param username 用户名
     * @param password 密码
     * @return
     */
    public static Ftp getFtp(String host,int port,String username, String password){
        // 创建FTP客户端
        Ftp ftp = new Ftp(host, port, username, password, StandardCharsets.UTF_8);
        // 设置传输模式
        ftp.setMode(FtpMode.Passive);
        return ftp;
    }

    /**
     * 获取符合条件的FTP文件列表
     * @param client FTPClient
     * @param list 文件列表
     * @param path 路径
     * @throws IOException
     */
    public static void getAllFileNode(FTPClient client, Map<Long,List<FTPFile>> list, String path, BiFunction<FTPFile,String, Long> function) throws IOException {
        client.changeWorkingDirectory(path);
        FTPFile[] ftpFiles = client.listFiles();
        if(ftpFiles != null && ftpFiles.length > 0) {
            for (FTPFile ftpFile : ftpFiles) {
                if(ftpFile.isFile()) {
                    //文件，直接加入
                    Long key = function.apply(ftpFile, path);
                    if(key != null) {
                        //条件符合
                        List<FTPFile> fileList = list.computeIfAbsent(key, k -> new ArrayList<>());
                        //文件名中，需要加上路径
                        ftpFile.setName(path + "/" + ftpFile.getName());
                        fileList.add(ftpFile);
                    }

                } else if(ftpFile.isDirectory()) {
                    //文件夹，需要继续深入读取
                    getAllFileNode(client, list, path+ "/" + ftpFile.getName(), function);
                }

            }
        }
    }

    /**
     * 创建文件夹
     * @param ftp
     * @param targetDir
     */
    public static void createDir(Ftp ftp, String targetDir) {
        //检查上级目录是否存在
        String preDir = targetDir.substring(0,targetDir.lastIndexOf("/"));
        if(!ftp.exist(preDir)) {
            //没有，则创建上级目录
            createDir(ftp, preDir);
        }
        //最后在创建本目录
        ftp.mkdir(targetDir);
    }

    /**
     * 获取单个文件信息
     * @param client
     * @param targetName
     * @return
     */
    public static FTPFile getFile(FTPClient client, String targetName) throws IOException {
        String path = targetName.substring(0, targetName.lastIndexOf("/"));
        String file = targetName.substring(targetName.lastIndexOf("/")+1);
        client.changeWorkingDirectory(path);
        FTPFile[] ftpFiles = client.listFiles();
        FTPFile res = null;
        if(ftpFiles != null && ftpFiles.length > 0) {
            for (FTPFile ftpFile : ftpFiles) {
                if(ftpFile.getName().equalsIgnoreCase(file)) {
                    res = ftpFile;
                    break;
                }
            }
        }
        return res;
    }
}
